#ifndef test_h
#define test_h


#define RUN_TEST(name, func, ...)	\
  do {							\
    test_try(name, __FILE__, __LINE__);			\
    if(!func(__VA_ARGS__))				\
      test_failure(name, __FILE__, __LINE__);		\
    else						\
      test_success(name, __FILE__, __LINE__);		\
  } while (0)


#define TEST_ASSERT(cond)				\
  do {							\
    if (!(cond)) {					\
      test_assertion_failed(__FILE__, __LINE__);	\
      return 0;						\
    }							\
  } while (0)

#define TEST_ASSERT_GOTO(cond, label)				\
  do {								\
    if (!(cond)) {						\
      test_assertion_failed(__FILE__, __LINE__);		\
      goto label;						\
    }								\
  } while (0)


void test_try(const char* testname, const char* file, int lineno);
void test_failure(const char* testname, const char* file, int lineno);
void test_success(const char* testname, const char* file, int lineno);
void test_report();
void test_assertion_failed(const char* filename, int lineno);

#endif  // test_h
